package org.example.collection.set;

import java.lang.reflect.Array;
import java.util.*;

public class Demo3 {
    public static void main(String[] args) {
//        test1();
//        test2();
        test3();
    }

    static class Clothes {
        Color color;
        public Clothes(String name, Color color) {
            this.color = color;
        }
        public Color getColor() {
            return color;
        }
    }

    private static void test3() {
        List<Clothes> list = new ArrayList<>();
        list.add(new Clothes("C001",Color.BLUE));
        list.add(new Clothes("C002",Color.YELLOW));
        list.add(new Clothes("C003",Color.RED));
        list.add(new Clothes("C004",Color.GREEN));
        list.add(new Clothes("C005",Color.BLUE));
        list.add(new Clothes("C006",Color.BLUE));
        list.add(new Clothes("C007",Color.RED));
        list.add(new Clothes("C008",Color.YELLOW));
        list.add(new Clothes("C009",Color.YELLOW));
        list.add(new Clothes("C010",Color.GREEN));

        // 方案1:使用HashMap
        Map<String,Integer> map = new HashMap<>();
        for (Clothes clothes:list){
            String colorName=clothes.getColor().name();
            Integer count = map.get(colorName);
            if(count!=null){
                map.put(colorName,count+1);
            }else {
                map.put(colorName,1);
            }
        }
        System.out.println(map);		// {RED=2, BLUE=3, YELLOW=3, GREEN=2}
        System.out.println("---------------");

        // 方案2:使用EnumMap
        Map<Color,Integer> enumMap=new EnumMap<>(Color.class);

        for (Clothes clothes:list){
            Color color=clothes.getColor();
            enumMap.merge(color, 1, Integer::sum);
        }
        System.out.println(enumMap);	// {GREEN=2, RED=2, BLUE=3, YELLOW=3}
    }

    private static void test2() {
        EnumSet<Type> set = EnumSet.of(Type.TYPE_ONE, Type.TYPE_FOUR);
        System.out.println(set);    // [TYPE_ONE, TYPE_FOUR]
    }

    enum Type{
        TYPE_ONE, TYPE_TWO, TYPE_THREE, TYPE_FOUR
    }

    enum Color {
        GREEN, RED, BLUE, BLACK, YELLOW
    }

    private static void test1() {
        // 空集合
        EnumSet<Color> enumSet = EnumSet.noneOf(Color.class);
        System.out.println("添加前：" + enumSet);   // 添加前：[]
        enumSet.add(Color.GREEN);
        enumSet.add(Color.RED);
        enumSet.add(Color.BLACK);
        enumSet.add(Color.BLUE);
        enumSet.add(Color.YELLOW);
        System.out.println("添加后：" + enumSet);   // 添加后：[GREEN, RED, BLUE, BLACK, YELLOW]

        System.out.println("-----------------------------------");

        // 使用allOf创建包含所有枚举类型的enumSet，其内部根据Class对象初始化了所有枚举实例
        EnumSet<Color> enumSet1 = EnumSet.allOf(Color.class);
        System.out.println("allOf直接填充：" + enumSet1);    // allOf直接填充：[GREEN, RED, BLUE, BLACK, YELLOW]

        System.out.println("-----------------------------------");

        // 初始集合包括枚举值中指定范围的元素
        EnumSet<Color> enumSet2 = EnumSet.range(Color.BLACK, Color.YELLOW);
        System.out.println("指定初始化范围：" + enumSet2);  // 指定初始化范围：[BLACK, YELLOW]
//        enumSet2 = EnumSet.range(Color.BLACK, Color.GREEN);

        System.out.println("-----------------------------------");

        // 指定补集，也就是从全部枚举类型中去除参数集合中的元素，如下去掉上述enumSet2的元素
        EnumSet<Color> enumSet3 = EnumSet.complementOf(enumSet2);
        System.out.println("指定补集：" + enumSet3);  // 指定补集：[GREEN, RED, BLUE]

        System.out.println("-----------------------------------");

        // 初始化时直接指定元素
        EnumSet<Color> enumSet4 = EnumSet.of(Color.BLACK);
        System.out.println("指定Color.BLACK元素：" + enumSet4);  // 指定Color.BLACK元素：[BLACK]
        EnumSet<Color> enumSet5 = EnumSet.of(Color.BLACK, Color.GREEN);
        System.out.println("指定Color.BLACK和Color.GREEN元素：" + enumSet5);  // 指定Color.BLACK和Color.GREEN元素：[GREEN, BLACK]

        System.out.println("-----------------------------------");

        // 复制enumSet5容器的数据作为初始化数据
        EnumSet<Color> enumSet6 = EnumSet.copyOf(enumSet5);
        System.out.println("enumSet6：" + enumSet6);  // enumSet6：[GREEN, BLACK]

        System.out.println("-----------------------------------");

        List<Color> list = new ArrayList<Color>();
        list.add(Color.BLACK);
        list.add(Color.BLACK);//重复元素
        list.add(Color.RED);
        list.add(Color.BLUE);
        System.out.println("list:" + list); // list:[BLACK, BLACK, RED, BLUE]

        // 使用copyOf(Collection<E> c)
        EnumSet<Color> enumSet7 = EnumSet.copyOf(list);
        System.out.println("enumSet7:" + enumSet7);  // enumSet7:[RED, BLUE, BLACK]
    }
}
